home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / otm3d095 / showasc.cpp < prev    next >
C/C++ Source or Header  |  1994-12-12  |  8KB  |  317 lines

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "3dtools.h"
  6. #include "mode13h.h"
  7.  
  8. //////// showasc.cpp - 3dStudio .asc file viewer
  9.      //  by Zach Mortensen [Voltaire/OTM]
  10.     //   compile using: 
  11.    //    wcl386 /mf /oneat /5r /d2 showasc.cpp 3dtools.obj sin.obj mode13h.obj
  12.   //
  13.  //      a nasty GPF appears without the /d2 switch...THIS IS NOT MY FAULT!
  14. //////// Ask WATCOM why a GP fault would disappear with a debug compile...  
  15.  
  16.  
  17. void main(int argc, char *argv[])
  18. {
  19.     FILE *inFile;
  20.     int tempInt, vertices, faces, count, vNum, tempA, tempB, tempC;
  21.     char tempChar;
  22.     float tempX, tempY, tempZ;
  23.     unsigned long tIn, tOut, *timer;
  24.     int shades, dist;
  25.  
  26.     if (argc < 2)
  27.     {
  28.         printf("USAGE:  showasc <filename.asc> <shading> <distance>\n");
  29.         printf("\nshading:  0 = none; 1 = lambert; 2 = gouraud\n");
  30.         printf("distance: distance between object and eye\n");
  31.         exit(1);
  32.     }
  33.  
  34.     if (argc > 2)
  35.         shades = atoi(argv[2]);
  36.     else
  37.         shades = sGouraud;
  38.  
  39.     if (argc > 3)
  40.         dist = atoi(argv[3]);
  41.     else
  42.         dist = 4096;
  43.  
  44.     char *tempStr = new char [80];
  45.     char *virtScreen = new char [64000];        // virtual page
  46.     short *zBuffer = new short[64000];          // z-buffer
  47.     obj3d *test = new obj3d(0, 0, dist);        // object #1 
  48.     obj3d *test2 = new obj3d(0, 0, dist);       // object #2
  49.  
  50.     inFile = fopen(argv[1], "rt");
  51.     if (inFile == NULL)
  52.     {
  53.         printf("%s does not exist!\n", argv[1]);
  54.         printf("USAGE:  showasc <filename.asc>\n");
  55.         exit(3);
  56.     }
  57.  
  58.     // parse the input file, get the object data we're after
  59.  
  60.     while (strncmp(tempStr, "Vertices", 8))
  61.     {
  62.         fscanf(inFile, "%s", tempStr);
  63.         if (feof(inFile))
  64.         {
  65.             printf("End-o-FILE and string \"Vertex\" NOT FOUND!!\n");
  66.             exit(2);
  67.         }
  68.     }
  69.  
  70.     printf("Found string: %s\n", tempStr);
  71.  
  72.     tempChar = fgetc(inFile);
  73.  
  74.     fscanf(inFile, "%d", &vertices);
  75.  
  76.     printf("Object has %d vertices\n", vertices);
  77.  
  78.     while (strncmp(tempStr, "Faces", 5))
  79.     {
  80.         fscanf(inFile, "%s", tempStr);
  81.         if (feof(inFile))
  82.         {
  83.             printf("End-o-FILE and string \"Faces\" NOT FOUND!!\n");
  84.             exit(2);
  85.         }
  86.     }
  87.  
  88.     printf("Found string: %s\n", tempStr);
  89.  
  90.     tempChar = fgetc(inFile);
  91.  
  92.     fscanf(inFile, "%d", &faces);
  93.  
  94.     printf("Object has %d faces\n", faces);
  95.  
  96.     while (strncmp(tempStr, "Vertex", 6))
  97.     {
  98.         fscanf(inFile, "%s", tempStr);
  99.         if (feof(inFile))
  100.         {
  101.             printf("End-o-FILE and string \"Vertex\" NOT FOUND!!\n");
  102.             exit(2);
  103.         }
  104.     }
  105.  
  106.     while (strncmp(tempStr, "list:", 5))
  107.     {
  108.         fscanf(inFile, "%s", tempStr);
  109.         if (feof(inFile))
  110.         {
  111.             printf("End-o-FILE and string \"list:\" NOT FOUND!!\n");
  112.             exit(2);
  113.         }
  114.     }
  115.  
  116.  
  117.  
  118.     printf("\nVertex data:\n");
  119.  
  120.     tempStr = "blah blah blah";
  121.  
  122.     for (count = 0; count < vertices; count++)
  123.     {
  124.         while (strncmp(tempStr, "Vertex", 6))
  125.         {
  126.             fscanf(inFile, "%s", tempStr);
  127.             if (feof(inFile))
  128.             {
  129.                 printf("End-o-FILE and string \"Vertex\" NOT FOUND!!\n");
  130.                 exit(2);
  131.             }
  132.         }
  133.  
  134.         fscanf(inFile, "%d", &vNum);
  135.         fscanf(inFile, "%s", tempStr);
  136.         fscanf(inFile, "%s", tempStr);
  137.         fscanf(inFile, "%f", &tempX);
  138.         fscanf(inFile, "%s", tempStr);
  139.         fscanf(inFile, "%f", &tempY);
  140.         fscanf(inFile, "%s", tempStr);
  141.         fscanf(inFile, "%f", &tempZ);
  142.  
  143.         printf("Vertex %d:  %8d %8d %8d\n", vNum, (int) tempX, (int) tempY, (int) tempZ);
  144.  
  145.         // add points to objects
  146.  
  147.         test->addLocalPoint((int) tempX, (int) tempY, (int) tempZ);
  148.         test2->addLocalPoint((int) tempX, (int) tempY, (int) tempZ);
  149.     }
  150.  
  151.     while (strncmp(tempStr, "Face", 4))
  152.     {
  153.         fscanf(inFile, "%s", tempStr);
  154.         if (feof(inFile))
  155.         {
  156.             printf("End-o-FILE and string \"Face\" NOT FOUND!!\n");
  157.             exit(2);
  158.         }
  159.     }
  160.  
  161.     printf("\nFound string: %s\n", tempStr);
  162.  
  163.     while (strncmp(tempStr, "list", 4))
  164.     {
  165.         fscanf(inFile, "%s", tempStr);
  166.         if (feof(inFile))
  167.         {
  168.             printf("End-o-FILE and string \"list\" NOT FOUND!!\n");
  169.             exit(2);
  170.         }
  171.     }
  172.  
  173.     printf("Found string: %s\n", tempStr);
  174.  
  175.     printf("\nFacial data:\n");
  176.  
  177.     for (count = 0; count < faces; count++)
  178.     {
  179.         while (strncmp(tempStr, "Face", 4))
  180.         {
  181.             fscanf(inFile, "%s", tempStr);
  182.             if (feof(inFile))
  183.             {
  184.                 printf("End-o-FILE and string \"Face\" NOT FOUND!!\n");
  185.                 exit(2);
  186.             }
  187.         }
  188.  
  189.         fscanf(inFile, "%d", &vNum);
  190.         fscanf(inFile, "%s", tempStr);
  191.  
  192.         while (fgetc(inFile) != 'A');
  193.         fgetc(inFile);                  // get the ':' character
  194.         fscanf(inFile, "%d", &tempA);   // get value for vertex A
  195.  
  196.         while (fgetc(inFile) != 'B');
  197.         fgetc(inFile);
  198.         fscanf(inFile, "%d", &tempB);
  199.  
  200.         while (fgetc(inFile) != 'C');
  201.         fgetc(inFile);
  202.         fscanf(inFile, "%d", &tempC);
  203.  
  204.         printf("Face %d:  %8d %8d %8d\n", vNum, (int) tempA, (int) tempB, (int) tempC);
  205.  
  206.         // add faces to objects
  207.  
  208.         test->addLocalPoly(tempA, tempB, tempC, 1);
  209.         test2->addLocalPoly(tempA, tempB, tempC, 32);
  210.     }
  211.  
  212.     // setup video mode, page flipping, z-buffer
  213.  
  214.     setMode13h(virtScreen, zBuffer);
  215.  
  216.     // set two color ranges in the palette
  217.  
  218.     for (count = 1; count < 20; count++)
  219.     {
  220.         set_dac_register(count, count, count + 5,
  221.             count + 15);
  222.         set_dac_register(count + 30, 15 + count, 5 + count,
  223.             count);
  224.     }
  225.  
  226.     // set shading and facing data for objects
  227.  
  228.     for (count = 0; count < test->numPolys; count++)
  229.     {
  230.         test->poly[count]->shading = shades;
  231.         test2->poly[count]->shading = shades;
  232.  
  233.         test->poly[count]->facing  = fOutside;
  234.         test2->poly[count]->facing  = fOutside;
  235.     }
  236.  
  237.     // create gouraud shading normals if we need them
  238.  
  239.     if (shades == sGouraud)
  240.     {
  241.         test->setGNormals();
  242.         test2->setGNormals();
  243.     }
  244.  
  245.     // rotate the second object 90 degrees about its z-axis
  246.  
  247.     test2->matRotate(0, 0, 90);
  248.  
  249.     // show the objects
  250.  
  251.     test->display();
  252.     test2->display();
  253.  
  254.     getch();
  255.  
  256.     // set up for offscreen drawing
  257.  
  258.     setActivePage(pVirtual);
  259.  
  260.     // get timer ticks
  261.  
  262.     timer = (unsigned long *) 0x046c;
  263.     tIn = *timer;
  264.  
  265.     // loop de loop...
  266.  
  267.     for (count = 1; (count <= 1000) && !kbhit(); count++)
  268.     {
  269.         // rotate our two objects
  270.  
  271.         test->matRotate(-2, 4, -6);
  272.         test2->matRotate(-5, 5, 1);
  273.  
  274.         // clear the screen
  275.  
  276.         clearScreen(0);
  277.  
  278.         // draw the objects to the virtual page
  279.  
  280.         test->display();
  281.         test2->display();
  282.  
  283.         // show the virtual page so we can see what we have done
  284.  
  285.         flipVPage();
  286.     }
  287.  
  288.     // get timer ticks
  289.  
  290.     tOut = *timer;
  291.  
  292.     // read keypress if we need to
  293.  
  294.     if (count < 1000)
  295.         getch();
  296.  
  297.  
  298.     // back to text mode
  299.  
  300.     textMode();
  301.  
  302.     // print timing info
  303.  
  304.     printf("%f frames per second\n", (float) ((count * 18.2) / (tOut - tIn)));
  305.  
  306.     // clean up a bit
  307.  
  308.     fclose(inFile);
  309.     delete test;
  310.     delete test2;
  311.     delete virtScreen;
  312.     delete zBuffer;
  313.  
  314.     exit(0);
  315. }
  316.  
  317.